#ifndef __TOOLS_H__
#define __TOOLS_H__

#include <stdint.h>
#include <openssl/ec.h>
#include <openssl/rand.h>

uint8_t* generate_secure_random_number(int num_bytes);

uint8_t* generateSecret(uint8_t *A, uint8_t *B, uint8_t *C);


/**
 * SM2加密 + 签名
 * @param out 保存输出数据的指针
 * @param out_len 输出数据的长度
 * @param in 输入数据指针，in的前4Byte要求空白填充
 * @param in_len 输入数据长度
 * @param encrypt_key 用于加密的SM2密钥
 * @param sign_key 用于签名的SM2密钥
 */
int encryptAndSign(uint8_t **out, uint32_t *out_len, uint8_t *in, uint32_t in_len, 
                EC_KEY *encrypt_key, EC_KEY *sign_key, uint32_t uuid);

/**
 * 验签 + SM2解密
 * @param out 保存输出数据的指针
 * @param out_len 输出数据的长度
 * @param in 输入数据指针
 * @param in_len 输入数据长度
 * @param decrypt_key 用于解密的SM2密钥
 * @param verify_key 用于验签的SM2密钥
 */
int verifyAndDecrypt(uint8_t **out, uint32_t *out_len, uint8_t *in, uint32_t in_len, 
                EC_KEY *decrypt_key, EC_KEY *verify_key, uint32_t uuid);

/**
 * SM4加密 + SM2签名
 * @param out 保存输出数据的指针
 * @param out_len 输出数据的长度
 * @param in 输入数据指针
 * @param in_len 输入数据长度
 * @param encrypt_key 用于加密的SM4密钥
 * @param sign_key 用于签名的SM2密钥
 */
int encryptAndSign_SM4(uint8_t **out, uint32_t *out_len, uint8_t *in, uint32_t in_len, 
                uint8_t *encrypt_key, EC_KEY *sign_key, uint32_t uuid);

/**
 * 验签 + SM4解密
 * @param out 保存输出数据的指针
 * @param out_len 输出数据的长度
 * @param in 输入数据指针
 * @param in_len 输入数据长度
 * @param decrypt_key 用于解密的SM4密钥
 * @param verify_key 用于验签的SM2密钥
 */
int verifyAndDecrypt_SM4(uint8_t **out, uint32_t *out_len, uint8_t *in, uint32_t in_len, 
                uint8_t *decrypt_key, EC_KEY *verify_key, uint32_t uuid);

/**
 * 解析16进制形式的字符串到二进制
 */
uint8_t* resolveHexStr(char *str);

/**
 * 以十六进制的方式打印
 * @param hex 要打印的数据
 * @param len hex的长度
 */
void printHex(uint8_t *hex, uint32_t len);

#endif